package cxydmmszl.chapter09.t148.middle;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/**
 * <li style="color: red;">Prob</li>
 * 有关阶乘的两个问题 2
 * <li style="color: green;">Desc</li>
 * 给定一个非负整数 N，如果用二进制数表达 N! 的结果，
 * 返回最低位的1在哪个位置上，认为最右的位置为位置0。
 * <br/><br/>备注：<br/>
 * 1⩽N⩽10^18
 * <li style="color: green;">Input</li>
 * 第一行一个整数 N。
 * <li style="color: green;">Output</li>
 * 输出一个整数表示答案。
 * <li style="color: blue;">Link</li> CD57
 *
 * @author habitplus
 * @since 2021-10-16 14:39
 */
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        long n = Long.parseLong(br.readLine());

        long ans = rightOnePosition2(n);
        System.out.println(ans);
    }

    /*
        因子 2 的个数
     */
    private static long rightOnePosition1(long n) {
        if (n < 1) return -1;
        long res = 0;
        while (n != 0) {
            n >>>= 1;
            res += n;
        }
        return res;
    }

    /*
        计算 n 中二进制表示中 1 的数量，假设为 m，
        则 N - m 就是 N! 的二进制数最右侧 1 的位置
     */
    private static long rightOnePosition2(long n) {
        if (n < 1) return -1;
        long k = n;
        int m = 0;
        while (k != 0) {
            m += (k & 1) != 0 ? 1 : 0;
            k >>>= 1;
        }
        return n - m;
    }
}
